<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Form
 * @version $Revision: 80 $
 */

/**
 * Element numeric stepper
 * @category libPrynel
 * @package Form
 * @subpackage Form_Element
 * @version 1.0.0 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 *       
 *
 */
class Form_Element_NumericStepper extends Form_Element_Text
{
	/**
	 * Valeur maxi autorisée
	 *
	 * @var mixed
	 * @access private
	 */
	private $max;
	
	/**
	 * Valeur mini autorisée
	 *
	 * @var mixed
	 * @access private
	 */
	private $min;
	
	/**
	 * Valeur de pas
	 *
	 * @var mixed
	 * @access public
	 */
	private $step;
	
	/**
	 * Valeur de départ
	 *
	 * @var mixed
	 * @access private
	 */
	private $start;
	
	/**
	 * Lien vers l'image du bouton +
	 * Attntion selon la taille de l'image le css devra être modifié
	 *
	 * @var string
	 * @access private
	 */
	private $stepperUp;
	
	/**
	 * Lien vers l'image du bouton -
	 * Attention selon la taille de l'image le css devra être changé
	 *
	 * @var string
	 * @access private
	 */
	private $stepperDown;
	
	/**
	 * Id de l'élément conteneur (span ou div)
	 *
	 * @var string
	 * @access private
	 */
	private $container;
	
	/**
	 * Constructeur. Initialise les valeurs par défaut
	 *
	 * @param string $nom
	 * @param Form_Form $form
	 */
	public function __construct($nom,$form)
	{
		parent::__construct($nom,$form);
		$this->max 			= 99;
		$this->min 			= 0;
		$this->step 		= 1;
		$this->start 		= 0;
		$this->stepperUp 	= 'up.gif';
		$this->stepperDown 	= 'down.gif';
		$this->container 	= '';
		$this->value = $this->start;
	}
	
	/**
	 * Défini la valeur max
	 *
	 * @param mixed $value
	 * @access public
	 * @return Form_Element_NumericStepper
	 */
	public function setMax($value)
	{
		$this->max = $value;
		return $this;
	}
	
	/**
	 * Défini la valeur mini
	 *
	 * @param mixed $value
	 * @access public
	 * @return Form_Element_NumericStepper
	 */
	public function setMin($value)
	{
		$this->min = $value;
		return $this;
	}
	
	/**
	 * Défini la valeur de pas
	 *
	 * @param mixed $value
	 * @access public
	 * @return Form_Element_NumericStepper
	 */
	public function setStep($value)
	{
		$this->step = $value;
		return $this;
	}
	
	/**
	 * Défini la valeur de départ
	 *
	 * @param mixed $value
	 * @access public
	 * @return Form_Element_NumericStepper
	 */
	public function startAt($value)
	{
		$this->startAt($value);
		$this->value($value);
		return $this;
	}
	
	/**
	 * Défini le chemin des images des boutons.
	 * Chemins relatifs à la page web
	 *
	 * @param string $up
	 * @param string $down
	 * @access public
	 * @return Form_Element_NumericStepper
	 */
	public function setSteppers($up,$down)
	{
		$this->stepperUp 	= $up;
		$this->stepperDown 	= $down;
		return $this;
	}
	
	/**
	 * Défini le conteneur
	 *
	 * @param string $value
	 * @return Form_Element_NumericStepper
	 */
	public function container($value)
	{
		$this->container = $value;
		return $this;
	}
	
	/**
	 * Valide la donnée recue
	 *
	 * @param mixed $value
	 * @access public
	 * @return boolean
	 */
	public function isValid($value)
	{
		if(parent::isValid($value))
		{
			if(!is_numeric($value))
			{
				$this->errorMsg = Form_Error::NUMERIC;
				return false;
			}
		}
		return true;
	}
	/**
	 * Vérifie que le conteneur est défini
	 * 
	 * @access private
	 */
	private function check()
	{
		if(empty($this->container))
			throw new Util_ExceptionHandler('::container() doit être obligatoirement utiliser');
	}
	
	/**
	 * Ecrit l'objet
	 *
	 * @access public
	 * @return string
	 */
	public function __toString()
	{
		$this->check();
		$css = $this->cssClass();
		$label = '';
		if(!empty($this->label))
		{
			$label = "\t".'<label for="'.$this->attrs['id'].'">'.$this->label.'</label>'."\n";
			if($this->labelNewLine)
				$label.="\t".'<br />'."\n";
		}
		$attributs = $this->attrsToString();
		//Posted value ou value par défaut
		$value = $this->form->getPostedvalue($this->attrs['name']);
		if(empty($value))
			$value = $this->value;
			
		$field = "\t".'<span id="'.$this->container.'"></span><br style="clear:both;display:none;" />'."\n";
		
		$error='';
		if(!is_null($this->errorMsg))
		{
			$error='<span class="'.$this->errorClass.'">'.$this->errorMsg.'</span><br />';
		}
		if(!empty($this->info))
			$field.="\t".'<img src="'.$this->imgInfo.'" id="'.$this->attrs['name'].'_tooltip" title="'.$this->info.'" alt="" style="cursor:help;" />';
		
		$js.="\t".'<script type="text/javascript">'."\n";
		$js.="\t\t".'new Control.NumericStepper(\''.$this->container.'\',
						{\'max\':'.$this->max.',
						\'min\':'.$this->min.',
						\'step\':'.$this->step.',
						\'start\':\''.$value.'\',
						\'id\':\''.$this->attrs['id'].'\',
						\'name\':\''.$this->attrs['name'].'\',
						\'stepperUp\':\''.$this->stepperUp.'\',
						\'stepperDown\':\''.$this->stepperDown.'\'});'."\n";
		$js.="\t".'</script>'."\n";
		return $label.$field.$error.$js;
	}
}
 ?>